package orgd

import (
	"errors"

	"gogs.xiaoyuanjijiehao.com/antlinker/antcms/core/common"
	"gogs.xiaoyuanjijiehao.com/antlinker/antcms/ddd"
)

var (
	_ OrgAggregateRoot = &orgAggregateRoot{}
)

func initOrg(d ddd.Domain, repo OrgRepo) {
	ar := &orgAggregateRoot{}
	ar.Init(ar, d, "org")
	repo.Init(repo, ar, "org")
}

// OrgAggregateRoot 组织的聚合根
type OrgAggregateRoot interface {
	ddd.AggregateRoot
	// 新增组织
	AddOrg(ctx ddd.Context, orgid string, org OrgDesc) (err error)
	// 获取指定组织：根据唯一标识获取组织实体
	GetOrg(ctx ddd.Context, id string) (ia *OrgAggregate, err error)
	// // 分页获取组织列表：根据唯一标识获取下一页指定数量的组织实体集合
	// // total 总数量
	// QueryPage(ctx ddd.Context, is OrgSearch, pi common.PageInfo) (npi common.PageInfo, result []OrgAggregate, err error)
}

// OrgRepo 组织仓储
type OrgRepo interface {
	ddd.Repository
	// 新增组织
	AddOrg(ctx ddd.Context, orgid string, org OrgDesc) (err error)
	// 获取指定组织：根据唯一标识获取组织实体
	GetOrg(ctx ddd.Context, orgid string) (*OrgAggregate, error)
	// // 分页获取组织列表：根据唯一标识获取下一页指定数量的组织实体集合
	// // total 总数量
	// QueryPage(ctx ddd.Context, is OrgSearch, pi common.PageInfo) (npi common.PageInfo, result []OrgAggregate, err error)
	// 修改组织
	UpdateDesc(ctx ddd.Context, orgid string, org OrgDesc) error
	// 删除组织 标记删除
	Delete(ctx ddd.Context, orgid string) error
	// 彻底删除指定组织
	Destroy(ctx ddd.Context, orgid string) error
	// 发布
	Publish(ctx ddd.Context, orgid string) error
	// 取消发布
	NoPublish(ctx ddd.Context, orgid string) error

	UpdateShowColumn(ctx ddd.Context, orgid string, columnids []string) error
	UpdateIcon(ctx ddd.Context, orgid string, icon []string) error
}

// OrgSearch 查询条件
type OrgSearch struct {
	Key string `json:"key,omitempty"` // 关键字搜索，匹配组织标题
	// TODO 这里设置查询条件
}

// OrgAggregate 组织聚合
type OrgAggregate struct {
	ddd.BaseAggregate
	OrgID           string `json:"org_id"`
	OrgDesc         `json:"desc"`
	common.Operator `json:"operator"`
}

// OrgDesc Org描述实例
type OrgDesc struct {
	Icon []string `json:"icon"` // - 组织图片
	// Desc      string   `json:"desc"`      //- 组织描述
	Columnids []string `json:"columnids"` // 组织展板显示栏目
	Status    int      `json:"status"`    // -1 删除　0 正常 1 发布
}

// Repo 获取聚合根对应的仓储
func (o *OrgAggregate) Repo() OrgRepo {
	return o.Repository().(OrgRepo)
}

// UpdateShowColumn 修改组织聚合中的组织描述
func (o *OrgAggregate) UpdateShowColumn(ctx ddd.Context, columnids []string) error {
	err := o.Repo().UpdateShowColumn(ctx, o.OrgID, columnids)
	if err != nil {
		return err
	}
	return err
}

// UpdateIcon 修改组织聚合中的图片
func (o *OrgAggregate) UpdateIcon(ctx ddd.Context, icon []string) error {
	err := o.Repo().UpdateIcon(ctx, o.OrgID, icon)
	if err != nil {
		return err
	}
	// o.Trigger(ctx,EvtTypOrg, EvtActUpdate, map[string]interface{}{
	// 	"old": o.OrgDesc,
	// 	"new": org,
	// })
	return err
}

// UpdateDesc 修改组织聚合中的组织描述
func (o *OrgAggregate) UpdateDesc(ctx ddd.Context, org OrgDesc) error {
	err := o.Repo().UpdateDesc(ctx, o.OrgID, org)
	if err != nil {
		return err
	}
	o.Trigger(ctx, EvtTypOrg, EvtActUpdate, map[string]interface{}{
		"old": *o,
		"new": org,
	})
	return err
}

// Delete 删除组织聚合
func (o *OrgAggregate) Delete(ctx ddd.Context) error {
	err := o.Repo().Delete(ctx, o.OrgID)
	if err != nil {
		return err
	}
	o.Trigger(ctx, EvtTypOrg, EvtActDelete, o.OrgDesc)
	return err
}

// Destroy 彻底删除组织聚合
func (o *OrgAggregate) Destroy(ctx ddd.Context) error {
	if o.Status == 0 {
		return errors.New("未删除不能进行彻底删除操作")
	}
	err := o.Repo().Destroy(ctx, o.OrgID)
	if err != nil {
		return err
	}
	o.Trigger(ctx, EvtTypOrg, EvtActDestroy, o.OrgDesc)
	return err
}

// Publish 发布
func (o *OrgAggregate) Publish(ctx ddd.Context) error {
	if o.Status != 0 {
		return errors.New("状态不对不能发布")
	}
	err := o.Repo().Publish(ctx, o.OrgID)
	if err != nil {
		return err
	}
	o.Trigger(ctx, EvtTypOrg, EvtActPublish, o.OrgDesc)
	return nil
}

// NoPublish 取消发布
func (o *OrgAggregate) NoPublish(ctx ddd.Context) error {
	if o.Status != 1 {
		return errors.New("状态不对不能发布")
	}
	err := o.Repo().NoPublish(ctx, o.OrgID)
	if err != nil {
		return err
	}
	o.Trigger(ctx, EvtTypOrg, EvtActPublish, o.OrgDesc)
	return nil
}

type orgAggregateRoot struct {
	ddd.BaseAggregateRoot
}

func (o *orgAggregateRoot) Repo() OrgRepo {
	return o.Repository().(OrgRepo)
}
func (o *orgAggregateRoot) AddOrg(ctx ddd.Context, orgid string, org OrgDesc) (err error) {
	return o.Repo().AddOrg(ctx, orgid, org)
}
func (o *orgAggregateRoot) GetOrg(ctx ddd.Context, id string) (ia *OrgAggregate, err error) {
	return o.Repo().GetOrg(ctx, id)
}

// // 分页获取组织列表：根据唯一标识获取下一页指定数量的组织实体集合
// // total 总数量
// func (o *orgAggregateRoot) QueryPage(ctx ddd.Context, is OrgSearch, pi common.PageInfo) (common.PageInfo, []OrgAggregate, error) {
// 	return o.Repo().QueryPage(ctx, is, pi)
// }
